//一条包含字母 A-Z 的消息通过以下映射进行了 编码 ：
//
//
//'A' -> "1"
//'B' -> "2"
//...
//'Z' -> "26"
//
// 要 解码 已编码的消息，所有数字必须基于上述映射的方法，反向映射回字母（可能有多种方法）。例如，"11106" 可以映射为：
//
//
// "AAJF" ，将消息分组为 (1 1 10 6)
// "KJF" ，将消息分组为 (11 10 6)
//
//
// 注意，消息不能分组为 (1 11 06) ，因为 "06" 不能映射为 "F" ，这是由于 "6" 和 "06" 在映射中并不等价。
//
// 给你一个只含数字的 非空 字符串 s ，请计算并返回 解码 方法的 总数 。
//
// 题目数据保证答案肯定是一个 32 位 的整数。
//
//
//
// 示例 1：
//
//
//输入：s = "12"
//输出：2
//解释：它可以解码为 "AB"（1 2）或者 "L"（12）。
//
//
// 示例 2：
//
//
//输入：s = "226"
//输出：3
//解释：它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
//
//
// 示例 3：
//
//
//输入：s = "06"
//输出：0
//解释："06" 无法映射到 "F" ，因为存在前导零（"6" 和 "06" 并不等价）。
//
//
//
//
// 提示：
//
//
// 1 <= s.length <= 100
// s 只包含数字，并且可能包含前导零。
//
//
// Related Topics 字符串 动态规划 👍 1461 👎 0

package leetcode.editor.cn;
//java:解码方法
public class Q0091DecodeWays {
    public static void main(String[] args){
        Solution solution = new Q0091DecodeWays().new Solution();
        solution.numDecodings("12");
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
//    public int numDecodings(String s) {
//        if (s == null || s.length() == 0 || s.length() > 100) return -1;
//        char[] charArray = s.toCharArray();
//        int a = 1;
//        int b = charArray[0] == '0' ? 0 : 1; // a 为 f(n - 2), b为f(n - 1)
//        int c = b;
//        for (int i = 1; i < charArray.length; i++) {
//            int cur = charArray[i] - '0';
//            int curAndPre = (charArray[i - 1] - '0') * 10 + (charArray[i] - '0');
//            if (cur > 0 && cur < 10 && curAndPre > 9 && curAndPre < 27) c = a + b;
//            if (cur > 0 && cur < 10 && curAndPre > 26) c = b;
//            if (cur == 0 && curAndPre > 9 && curAndPre < 27) c = a;
//            a = b;
//            b = c;
//        }
//        return c;
//    }

        public int numDecodings(String s) {
            int n = s.length();
            s = " " + s;
            char[] charArray = s.toCharArray();
            int a = 1, b = 1, c = 0;
            for (int i = 1; i <= n; i++) {
                c = 0;
                int cur = charArray[i] - '0', curAndPre = (charArray[i - 1] - '0') * 10 + (charArray[i] - '0');
                if (1 <= cur && cur <= 9) c = b;
                if (10 <= curAndPre && curAndPre <= 26) c += a;
                a = b;
                b = c;
            }
            return c;
        }
        
}
//leetcode submit region end(Prohibit modification and deletion)

}